var express = require('express');
var router = express.Router();

const md5 = require('blueimp-md5');
const {UserModel,ChatModel} = require('../db/models');
const filter = {password: 0, __v: 0};

/* GET home page. */
router.get('/', function (req, res, next) {
  res.render('index', {title: 'Express'});
});

//注册一个路由：用户注册
/*
path为：/register
请求方式：POST
接收参数username和password
admin是已注册用户
注册成功返回：{code：0，data：{_id:'abc', username:'xxx',password:'123'}}
注册失败返回：{code：1，msg：'此用户已存在'}
 */
router.post('/register', function (req, res) {
  // 1.获取请求参数
  const {username, password, type} = req.body;
  // 2.处理
  // 判断用户是否存在
  UserModel.findOne({username}, function (err, user) {
    if (user) { //存在
      res.send({code: 1, msg: '此用户已存在'})
    } else {   //不存在
      // 创建UserModel实例
      new UserModel({username, password: md5(password), type}).save(function (error, user) {
        // 生成cookie
        res.cookie('userid', user._id, {maxAge: 1000 * 60 * 60 * 24});

        // 3.返回响应数据
        const data = {username, type, _id: user._id};
        res.send({code: 0, data})
      });
    }
  });
});

// 登陆的路由
router.post('/login', function (req, res) {

  const {username, password} = req.body;
  // 根据username和password查询数据库users，如果没有，返回提示错误信息，如果有，返回登录成功信息（包含user）
  UserModel.findOne({username, password: md5(password)}, filter, function (error, user) {
    if (user) {   // 登录成功
      res.cookie('userid', user._id, {maxAge: 1000 * 60 * 60 * 24});
      // 返回登录成功信息
      res.send({code: 0, data: user})
    } else {     // 登录失败
      res.send({code: 1, msg: '用户名或密码不正确'})
    }
  })
});

// 更新用户信息的路由
router.post('/update', function (req, res) {
  // 从请求的cookie得到userid
  const userid = req.cookies.userid;
  if (!userid) {
    return res.send({code: 1, msg: '请先登录'});
  }
  // 存在，根据userid更新对应的user数据
  const user = req.body;
  UserModel.findByIdAndUpdate({_id: userid}, user, function (error, oldUser) {
    if (!oldUser) { //查找不到对应的userid
      // 通知浏览器删除userid cookie
      res.clearCookie('userid');
      return res.send({code: 1, msg: '请先登录'});
    } else {
      // 准备一个返回的user数据对象
      const {_id, username, type} = oldUser;
      const data = Object.assign(user, {_id, username, type});
      // 返回
      res.send({code: 0, data: data})
    }
  })
});

// 获取用户信息的路由（根据cookie中的userid）
router.get('/user', function (req, res) {
  // 从请求的cookie得到userid
  const userid = req.cookies.userid;
  if (!userid) {
    return res.send({code: 1, msg: '请先登录'});
  }
  // 根据userid查询对应的user
  UserModel.findOne({_id: userid}, filter, function (error, user) {
    res.send({code: 0, data: user})
  })
});

// 获取对应类型的用户列表(根据user中的type)
router.get('/userlist', function (req, res) {
  const {type} = req.query;
  UserModel.find({type}, filter, function (error, users) {
    res.send({code: 0, data: users})
  })
});

// 获取当前用户所有相关聊天信息列表
router.get('/msglist', function (req, res) {
  // 获取cookie中的userid
  const userid = req.cookies.userid;
  // 查询得到所有的user
  UserModel.find(function (err, userDocs) {
    // 用对象存储所有user的信息：key为user的_id，val为name和header组成的user对象
    const users = userDocs.reduce((users, user) => {
      users[user._id] = {username: user.username, header: user.header}
      return users
    }, {});

    /*查询userid相关的所有聊天信息
      参数1：查询条件
      参数2：过滤条件
      参数3：回调函数
     */
    ChatModel.find({'$or': [{from: userid}, {to: userid}]}, filter, function (err, chatMsgs) {
      res.send({code: 0, data: {users, chatMsgs}})
    })
  })
});

// 修改指定消息为已读
router.post('/readmsg',function (req,res) {
  const from = req.body.from;
  const to = req.cookies.userid;
  /*
  更新数据库中的chat数据
  参数1：查询条件
  参数2：更新为指定的数据对象
  参数3：是否一次更新多条，默认只更新一条
  参数4：更新完成的回调函数
   */
  ChatModel.update({from,to,read:false},{read:true},{multi:true},function (err,doc) {
    res.send({code:0,data:doc.nModified})
  })
});


module.exports = router;
